<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>员工列表</title>

<!-- web路径问题 
	不以/开始的相对路径，找资源，是以当前资源的路径为基准，经常容易出问题
	所以要定位一个绝对路径，从当前项目开始找，
	以服务器的路径为标准（http://localhost:3306），需要加上项目名
	http://localhost:3306/crud
-->
<%
	pageContext.setAttribute("APP_PATH", request.getContextPath());
%>
<!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery，所以必须放在前边) -->
<script src="${APP_PATH }/static/js/jquery-1.11.0.min.js"></script>
<!-- 引入Bootstrap样式 -->
<link rel="stylesheet"
	href="${APP_PATH }/static/bootstrap-3.4.1-dist/css/bootstrap.min.css">
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script
	src="${APP_PATH }/static/bootstrap-3.4.1-dist/js/bootstrap.min.js"></script>
</head>
<body>
	<!-- 员工修改的模态框 -->
	<div class="modal fade" id="empUpdateModal" tabindex="-1" role="dialog"
		aria-labelledby="myModalLabel">
		<div class="modal-dialog" role="document">
			<div class="modal-content">
				<div class="modal-header">
					<button type="button" class="close" data-dismiss="modal"
						aria-label="Close">
						<span aria-hidden="true">&times;</span>
					</button>
					<h4 class="modal-title" id="myModalLabel">员工修改</h4>
				</div>
				<div class="modal-body">
				<!-- 模态框内部显示的样式 -->
					<form class="form-horizontal">
						<div class="form-group">
							<label for="empName_input" class="col-sm-2 control-label">EmpName</label>
							<div class="col-sm-10">
								<p class="form-control-static" id="empName_update_static">email@example.com</p>
								<span class="help-block"></span>
							</div>
						</div>
						<div class="form-group">
							<label for="email_add_input" class="col-sm-2 control-label">Email</label>
							<div class="col-sm-10">
								<input type="text" name="email" class="form-control" id="email_update_input"
									placeholder="email:123456@qq.com">
								<span class="help-block"></span>
							</div>
						</div>
						
						<div class="form-group">
							<label for="email_add_input" class="col-sm-2 control-label">Gender</label>
							<div class="col-sm-10">
								<label class="radio-inline"> <input type="radio"
									name="gender" id="gender1_update_input" value="M" checked="checked">
									男
								</label> <label class="radio-inline"> <input type="radio"
									name="gender" id="gender2_update_input" value="F">
									女
								</label>
							</div>
						</div>
						
						<div class="form-group">
							<label for="email_add_input" class="col-sm-2 control-label">DeptName</label>
							<div class="col-sm-4">
								<!-- 从数据库中读取部门信息，显示在下拉框 -->
								<select class="form-control" name="dId" id="dept_update_select">
								</select>
							</div>
						</div>
					</form>

				</div>
				<div class="modal-footer">
					<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
					<button type="button" class="btn btn-primary" id="emp_update_btn">更新</button>
				</div>
			</div>
		</div>
	</div>
	

	<!-- 员工添加的模态框 -->
	<div class="modal fade" id="empAddModal" tabindex="-1" role="dialog"
		aria-labelledby="myModalLabel">
		<div class="modal-dialog" role="document">
			<div class="modal-content">
				<div class="modal-header">
					<button type="button" class="close" data-dismiss="modal"
						aria-label="Close">
						<span aria-hidden="true">&times;</span>
					</button>
					<h4 class="modal-title" id="myModalLabel">员工添加</h4>
				</div>
				<div class="modal-body">
				<!-- 模态框内部显示的样式 -->
					<form class="form-horizontal">
						<div class="form-group">
							<label for="empName_input" class="col-sm-2 control-label">EmpName</label>
							<div class="col-sm-10">
								<input type="text" name="empName" class="form-control" id="empName_input"
									placeholder="empName">
								<span class="help-block"></span>
							</div>
						</div>
						<div class="form-group">
							<label for="email_add_input" class="col-sm-2 control-label">Email</label>
							<div class="col-sm-10">
								<input type="text" name="email" class="form-control" id="email_add_input"
									placeholder="email:123456@qq.com">
								<span class="help-block"></span>
							</div>
						</div>
						
						<div class="form-group">
							<label for="email_add_input" class="col-sm-2 control-label">Gender</label>
							<div class="col-sm-10">
								<label class="radio-inline"> <input type="radio"
									name="gender" id="gender1_add_input" value="M" checked="checked">
									男
								</label> <label class="radio-inline"> <input type="radio"
									name="gender" id="gender2_add_input" value="F">
									女
								</label>
							</div>
						</div>
						
						<div class="form-group">
							<label for="email_add_input" class="col-sm-2 control-label">DeptName</label>
							<div class="col-sm-4">
								<!-- 从数据库中读取部门信息，显示在下拉框 -->
								<select class="form-control" name="dId" id="dept_add_select">
								</select>
							</div>
						</div>
					</form>

				</div>
				<div class="modal-footer">
					<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
					<button type="button" class="btn btn-primary" id="emp_save_btn">保存</button>
				</div>
			</div>
		</div>
	</div>
	

	<!-- 搭建显示界面 -->
	<div class="contoiner" style=" width: 1000px">
		<!-- 标题 -->
		<div class="row">
			<div class="col-md-12">
				<h1>SSM-CRUD</h1>
			</div>
		</div>
		<!-- 按钮 -->
		<div class="row">
			<!-- 向右偏移四个列宽度 -->
			<div class="col-md-4 col-md-offset-8">
				<button class="btn btn-primary" id="emp_add_model_btn">新增</button>
				<button class="btn btn-danger" id="emp_delete_all_btn">删除</button>
			</div>
		</div>
		<!-- 显示表格数据 -->
		<div class="row">
			<div class="col-md-12">
				<table class="table table-hover" id="emps_table">
					<thead>
						<tr>
							<th>
								<input type="checkbox" id="check_all"/>
							</th>
							<th>#</th>
							<th>EmpName</th>
							<th>Gender</th>
							<th>Email</th>
							<th>DeptName</th>
							<th>操作</th>
						</tr>
					</thead>
					<tbody>

					</tbody>
				</table>
			</div>
		</div>
		<!-- 显示分页信息 -->
		<div class="row">
			<!-- 分页文字信息 -->
			<div class="col-md-6" id="page_info_area"></div>
			<!-- 分页条信息 -->
			<div class="col-md-6" id="page_nav_area"></div>
		</div>
	</div>

	<!-- 写入js语言 -->
	<script type="text/javascript">
		var totalRecord;	// 总数据数
		var currentPage;	// 当前页
		//页面加载完成之后，直接发送一个ajax请求，要到分页数据
		$(function() {
			// 去首页
			to_page(1);

		});

		// 跳转到指定页面
		function to_page(pn) {
			$.ajax({
				url : "${APP_PATH}/emps",
				data : "pn=" + pn,
				type : "GET",
				success : function(result) {
					//console.log(result);
					//1。解析并显示员工数据
					build_emps_table(result);
					//2、解析并显示分页数据
					build_page_info(result);
					//3、解析显示分页条
					build_page_nav(result);
				}
			});
		}

		// 构建table
		function build_emps_table(result) {

			// 清空table表
			$("#emps_table tbody").empty();
			var emps = result.extend.pageinfo.list;
			$.each(emps, function(index, item) {
				var checkBoxTd = $("<td><input type='checkbox' class='check_item' /></td>");
				var empIdTd = $("<td></td>").append(item.empId);
				var empNameTd = $("<td></td>").append(item.empName);
				var empGenderTd = $("<td></td>").append(item.gender == "M" ? "男" : "女");
				var empEmailTd = $("<td></td>").append(item.email);
				var empDeptNameTd = $("<td></td>").append(
						item.department.deptName);
				/*
				<button class="btn btn-success btn-sm">
									<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
									编辑
								</button>
				 */
				 // 为编辑按钮添加一个自定义的属性，来表示当前员工的ID
				var editBtn = $("<button></button>").addClass("btn btn-success btn-sm edit_btn").append(
						$("<span></span>").addClass("glyphicon glyphicon-pencil")).append("编辑");
				editBtn.attr("edit_id",item.empId);
				var delBtn = $("<button></button>").addClass("btn btn-danger btn-sm delete_btn").append(
						$("<span></span>").addClass("glyphicon glyphicon-trash")).append("删除");
				delBtn.attr("del_id",item.empId);
				var btnTd = $("<td></td>").append(editBtn).append(" ").append(delBtn);
				
				// append方法执行完之后还是返回原来的元素
				$("<tr></tr>").append(checkBoxTd).append(empIdTd).append(empNameTd).append(
						empGenderTd).append(empEmailTd).append(empDeptNameTd)
						.append(btnTd).appendTo("#emps_table tbody");
			});
		}

		//解析显示分页信息
		function build_page_info(result) {
			// 清空分页信息
			$("#page_info_area").empty();
			$("#page_info_area").append(
					"当前第" + result.extend.pageinfo.pageNum + "页，总"
							+ result.extend.pageinfo.pages + "页，总"
							+ result.extend.pageinfo.total + "共条记录");
			
			// 获取到总记录数
			totalRecord = result.extend.pageinfo.total;
			// 获取到当前页
			currentPage = result.extend.pageinfo.pageNum;
		}

		//解析显示分页条
		function build_page_nav(result) {
			//page_nav_area
			/*<li>
			<a href="#" aria-label="Previous">
			<span aria-hidden="true">&laquo;</span>
			</a>
			</li>*/
			// 清空分页条信息
			$("#page_nav_area").empty();
			var ul = $("<ul></ul>").addClass("pagination");
			
			//构建元素
			// 首页
			var firstPageLi = $("<li></li>").append($("<a></a>").append("首页").attr("href", "#"));
			// 为首页添加点击相应事件
			firstPageLi.click(function() {
				to_page(1);
			});
			
			// 前一页
			var prePageLi = $("<li></li>").append($("<a></a>").append("&laquo;"));
			// 如果是第一页
			if (result.extend.pageinfo.isFirstPage) {
				prePageLi.addClass("disabled");
			}else{
				// 为前一页实现点击跳转
				prePageLi.click(function() {
					to_page(result.extend.pageinfo.pageNum - 1);
				});
			}
			
			// 后一页
			var nextPageLi = $("<li></li>").append($("<a></a>").append("&raquo;"));
			// 如果是最后一页
			if (result.extend.pageinfo.isLastPage) {
				nextPageLi.addClass("disabled");
			}else{
				// 为后一页实现点击跳转
				nextPageLi.click(function() {
					to_page(result.extend.pageinfo.pageNum + 1);
				});
			}
			// 末页
			var lastPageLi = $("<li></li>").append($("<a></a>").append("末页").attr("href", "#"));
			// 为末页添加跳转
			lastPageLi.click(function() {
				to_page(result.extend.pageinfo.pages);
			});
			
			// 添加首页和前一页
			ul.append(firstPageLi).append(prePageLi);
			// 遍历添加页码
			$.each(result.extend.pageinfo.navigatepageNums, function(index,
					item) {
				var numLi = $("<li></li>").append($("<a></a>").append(item));
				// 如果遍历的是当前页，就高亮显示
				if (result.extend.pageinfo.pageNum == item) {
					numLi.addClass("active");
				}

				numLi.click(function() {
					to_page(item);
				});
				// 添加页码
				ul.append(numLi);
			});

			// 添加下一页和末页
			ul.append(nextPageLi).append(lastPageLi);

			// 把ul加入到nav
			var navEle = $("<nav></nav>").append(ul);
			navEle.appendTo("#page_nav_area");
		}
		
		// 为新增按钮添加模态框
		$("#emp_add_model_btn").click(function() {
			// 每次清除表单数据,表单重置
			$("#empAddModal form")[0].reset();
			// 重置用户名输入框的提示信息
			show_validate_msg("#empName_input","","");
			// 重置email输入框的提示信息
			show_validate_msg("#email_add_input","","");
			
			
			// 发送ajax请求查出部门信息，显示在下拉列表中
			getDepts("#dept_add_select");
			
			// 弹出模态框
			$("#empAddModal").modal({
				backdrop:"static"
			});
		});
		
		// 查询出所有部门信息并显示
		function getDepts(ele) {
			//每次点击添加之前先清空下拉框中的内容
			$(ele).empty();
			
			// 发送请求获取到部门信息
			$.ajax({
				url:"${APP_PATH}/depts",
				type:"GET",
				success:function(result){
					// console.log(result);
					// 显示部门信息在下拉列表中
					$.each(result.extend.depts,function(){
						// 获取到部门信息，
						var optionEle = $("<option></option>").append(this.deptName).attr("value",this.deptId);
						// 将部门信息添加到下拉列表中
						optionEle.appendTo(ele);
					});
					
				}
			});
		}
		
		// 校验表单数据
		function validata_add_form() {
			// 1、先拿到校验的数据，使用正则表达式
			var empName = $("#empName_input").val();
			var regName = /(^[a-zA-Z0-9_-]{3,16}$)|(^[\u2E80-\u9FFF]{2,5})/;
			if(!regName.test(empName)){
				// alert("用户名可以是2~5位中文或3~16位英文组合");
				// 每次增加新样式之前都应该清空之前的样式
				// 如果名称校验不正确，输入框变红，
				// 下方显示错误提示信息
				show_validate_msg("#empName_input","error","用户名可以是2~5位中文或3~16位英文组合");
				return false;
			}else{
				show_validate_msg("#empName_input","success","用户名正确！");
			}
			
			// 校验邮箱是否正确
			var email = $("#email_add_input").val();
			var regEmail = 	/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
			if(!regEmail.test(email)){
				// alert("邮箱格式不正确！");
				show_validate_msg("#email_add_input","error","邮箱格式不正确！");
				return false;
			}else{
				show_validate_msg("#email_add_input","success","邮箱正确！");
			}
			
			return true;
		}
		
		// 统一处理校验操作
		function show_validate_msg(ele,status,msg) {
			// 清除以前的正确和错误样式
			$(ele).parent().removeClass("has-success has-error");
			// 文本恢复为空
			$(ele).next("span").text("");
			
			if(status == "success"){
				$(ele).parent().addClass("has-success");
				$(ele).next("span").text(msg);
			}else if(status == "error"){
				$(ele).parent().addClass("has-error");
				$(ele).next("span").text(msg);
			}
		}
		
		// 校验用户名是否可用
		$("#empName_input").change(function() {
			// 发送ajax请求校验用户名是否可用
			// 获取到当前输入框的内容
			var empName = this.value;
			
			$.ajax({
				url:"${APP_PATH}/checkuser",
				data:"empName=" + empName,
				type:"POST",
				success:function(result){
					// 如果返回的状态码是100，表示成功
					if(result.code == 100){
						show_validate_msg("#empName_input", "success", "用户名可用！");
						// 给保存按钮增加一个自定义的属性，作为是否可以保存的依据
						$("#emp_save_btn").attr("ajax_va","success");
						$("#emp_save_btn").removeClass("disabled");
					}else{
						show_validate_msg("#empName_input", "error", result.extend.va_msg);
						$("#emp_save_btn").attr("ajax_va","error");
						$("#emp_save_btn").addClass("disabled");
					}
				}
			});
		});
		
		// 保存按钮的单击事件
		$("#emp_save_btn").click(function() {
			// 1、模态框中填写的表单数据提交给服务器进行保存
			// 先对要提交给服务器的数据进行校验
			// 如果校验发现数据不满足规则，则直接返回
			if(!validata_add_form()){
				// 在校验出错返回之前，先判断用户名的错误类型是重复还是不符合规则
				if($(this).attr("ajax_va") == "error"){
					show_validate_msg("#empName_input", "error", "用户名重复");
				}
				return false;
			}
			// 2、判断之前的用户名校验是否成功，如果成功了发送保存，
			if($(this).attr("ajax_va") == "error"){
				show_validate_msg("#empName_input", "error", "用户名重复");
				return false;
			}
			
			
			// 3、发送ajax请求保存员工
			var t = $("#empAddModal form").serialize()
			// 解决,转码
			var d = decodeURIComponent(t);

			alert(d);

			// alert($("#empName_input").text());
			$.ajax({
				url : "${APP_PATH}/emp",
				data : d,
				type : "POST",
				success : function(result) {
					
					// 返回成功信息
					//alert(result.msg);
					
					// 如果返回100，表示校验成功！
					if(result.code == 100){
						// 员工保存成功后，
						// 1、关闭模态框
						$('#empAddModal').modal('hide');
						// 2、来到最后一页显示刚才的数据
						//发送ajax请求显示最后一页数据(总记录数)
						to_page(totalRecord);
					}else{
						// 校验失败 显示失败信息
						// console.log(result);
						// 有哪个字段的错误信息就显示哪个字段的
						/* if(undefined != result.extend.errorFielde.email){
							// 显示邮箱的错误信息
							show_validate_msg("#email_add_input","error",result.extend.errorFielde.email);
						}
						if(undefined != result.extend.errorFielde.empName){
							// 显示员工名字的错误信息
							show_validate_msg("#empName_input","error",result.extend.errorFielde.empName);
						} */
						alert("后端校验失败！");
					}
				
					
				}
			});
			
		});
		
		// 为编辑按钮绑定事件
		// 利用jQuery的on元素绑定
		$(document).on("click",".edit_btn",function(){
			
			
			// alert("edit");
			// 1、查出员工信息，显示员工列表
			getEmp($(this).attr("edit_id"));
			// $(this).attr("ajax_va")
			// 2、查出部门信息，并显示部门列表
			getDepts("#dept_update_select");
			
			// 3、把员工id传递给更新按钮
			$("#emp_update_btn").attr("edit_id",$(this).attr("edit_id"));
			// 4、弹出模态框
			$("#empUpdateModal").modal({
				backdrop:"static"
			});
			
		});
		
		// 为删除按钮增加点击事件
		$(document).on("click",".delete_btn",function(){
			// 1、弹出是否删除会话框
			// 获取到当前员工姓名
			var empName = $(this).parents("tr").find("td:eq(2)").text();
			// alert(empName);
			// 确认框，确认返回true
			if(confirm("确认删除“" + empName + "”吗？")){
				$.ajax({
					url:"${APP_PATH}/emp/" + $(this).attr("del_id"),
					type:"DELETE",
					success:function(result){
						alert(result.msg);
						to_page(currentPage);
					}
				});
			}
		});
		
		// 查询员工并显示
		function getEmp(id) {
			
			$.ajax({
				url:"${APP_PATH}/emp/" + id,
				type:"GET",
				success:function(result){
					// console.log(result);
					var empData = result.extend.emp;
					$("#empName_update_static").text(empData.empName);
					$("#email_update_input").val(empData.email);
					$("#empUpdateModal input[name=gender]").val([empData.gender]);
					$("#dept_update_select").val([empData.dId]);
					
				}
			});
		}
		
		
		// 点击更新按钮更新员工信息
		$("#emp_update_btn").click(function() {
			// 1、校验邮箱是否正确
			var email = $("#email_update_input").val();
			var regEmail = 	/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
			if(!regEmail.test(email)){
				// alert("邮箱格式不正确！");
				show_validate_msg("#email_update_input","error","邮箱格式不正确！");
				return false;
			}else{
				show_validate_msg("#email_update_input","success","邮箱正确！");
			}
			
			// 2、发送ajax请求保存更新的信息
			$.ajax({
				url:"${APP_PATH}/emp/" + $(this).attr("edit_id"),
				type:"PUT",
				// 使用rest的转换机制，将POST请求转换为PUT
				// type:"POST",
				// data:$("#empUpdateModal form").serialize() + "&_method=PUT",
				data:$("#empUpdateModal form").serialize(),
				success:function(result){
					// alert(result.msg);
					// 1、关闭模态框
					$("#empUpdateModal").modal('hide');
					// 2、回到本页面
					to_page(currentPage);	
				}
			});
			
		});
		
		// 完成全选和全不选
		$("#check_all").click(function() {
			// 使用prop来读取dom原生的值
			// alert($(this).prop("checked"));
			// 让其他多选框的值和第一个的状态一致
			$(".check_item").prop("checked",$(this).prop("checked"));
		});
		
		// check_item
		$(document).on("click",".check_item",function(){
			// 判断当前选中的元素是否是等于当前页的复选框的个数
			// alert($(".check_item:checked").length);
			var flag = $(".check_item:checked").length == $(".check_item").length;
			// 将结果赋值给全选按钮
			$("#check_all").prop("checked",flag);
		});
		
		// 点击全部删除，就批量删除
		$("#emp_delete_all_btn").click(function() {
			// this
			var empNames = "";
			var del_empIDs = "";
			$.each($(".check_item:checked"),function(){
				// this
				// 组装员工名字字符
				empNames += $(this).parents("tr").find("td:eq(2)").text() + "，";
				// 组装员工ID字符
				del_empIDs += $(this).parents("tr").find("td:eq(1)").text() + "-";
			});
			
			// 去除员工名字字符多余的“,”和员工ID字符多余的“-”字符串
			empNames = empNames.substring(0, empNames.length-1);
			del_empIDs = del_empIDs.substring(0, del_empIDs.length-1);
			if(empNames == ""){
				alert("未选中任何内容！");
				return false;
			}
			// 询问是否全部删除
			if(confirm("确认删除“ " + empNames + " ”吗？")){
				// 发送ajax请求
				$.ajax({
					url:"${APP_PATH}/emp/" + del_empIDs,
					type:"DELETE",
					success:function(result){
						alert(result.msg);
						// 回到当前页面
						to_page(currentPage);
					}
				});
			}
			
		});
		
	</script>

</body>
</html>